import { api } from '@/utils/request';
import type {
  UserListResponse,
  UserSearchParams,
  UserDetail,
  UserStatus,
  UserCoins,
  UserTransactions
} from '@/types/user';

/**
 * 사용자 관리 API 서비스 클래스
 */
export class UserService {
  private static readonly BASE_URL = '/api/admin/users';

  /**
   * 사용자 목록 조회
   * @param params 검색 파라미터
   */
  static async getUserList(params: UserSearchParams = {}): Promise<UserListResponse> {
    const response = await api.get<{ data: UserListResponse }>(
      this.BASE_URL,
      { params }
    );
    return response.data;
  }

  /**
   * 사용자 상세 조회
   * @param id 사용자 ID
   */
  static async getUserDetail(id: number): Promise<UserDetail> {
    const response = await api.get<{ data: UserDetail }>(
      `${this.BASE_URL}/${id}`
    );
    return response.data;
  }

  /**
   * 사용자 상태 업데이트
   * @param id 사용자 ID
   * @param status 새로운 상태
   */
  static async updateUserStatus(id: number, status: UserStatus): Promise<void> {
    await api.put(`${this.BASE_URL}/${id}/status`, { status });
  }

  /**
   * 사용자 거래 기록 조회
   * @param id 사용자 ID
   * @param params 조회 파라미터
   */
  static async getUserTransactions(
    id: number,
    params: { page?: number; limit?: number; type?: 'all' | 'deposit' | 'withdraw' } = {}
  ): Promise<any> {
    const response = await api.get<{ data: any }>(
      `${this.BASE_URL}/${id}/transactions`,
      { params }
    );
    return response.data;
  }

  /**
   * 사용자 통계 정보 조회
   * @param id 사용자 ID
   */
  static async getUserStats(id: number): Promise<any> {
    const response = await api.get<{ data: any }>(
      `${this.BASE_URL}/${id}/stats`
    );
    return response.data;
  }

  /**
   * 사용자 삭제 (하드 삭제, 모든 관련 데이터 일괄 삭제)
   * @param id 사용자 ID
   */
  static async deleteUser(id: number): Promise<void> {
    await api.delete(`${this.BASE_URL}/${id}`);
  }

  /**
   * 获取用户持有币信息
   * @param id 사용자 ID
   */
  static async getUserCoins(id: number): Promise<UserCoins> {
    const response = await api.get<{ data: UserCoins }>(
      `${this.BASE_URL}/${id}/coins`
    );
    return response.data;
  }

  /**
   * 调整用户锁仓金额
   * @param id 사용자 ID
   * @param lockedAmount 锁仓金额 (NEAR)
   */
  static async adjustLockedAmount(id: number, lockedAmount: number): Promise<void> {
    await api.post(`${this.BASE_URL}/${id}/adjust-locked`, { lockedAmount });
  }

  /**
   * 修改用户信息(密码、卡号、电话号)
   * @param id 사용자 ID
   * @param data 要修改的数据
   */
  static async updateUserInfo(
    id: number,
    data: {
      password?: string;
      withdrawalAccount?: string;
      mobileNumber?: string;
    }
  ): Promise<any> {
    const response = await api.put<{ data: any }>(
      `${this.BASE_URL}/${id}/info`,
      data
    );
    return response.data;
  }
}